const WebSocket = require('ws');

// 测试配置
const config = {
    wsUrl: 'ws://localhost:3000/user-service/websocket',
    testToken: 'test_token_123', // 这里需要替换为真实的token
    testUserId: 1, // 测试用户ID
    testCharacterId: 2001, // 测试角色ID
};

// 测试玩家位置功能
async function testCharacterLocationFeature() {
    console.log('🚀 开始测试玩家位置功能...');

    try {
        // 1. 建立WebSocket连接
        console.log('📡 建立WebSocket连接...');
        const ws = new WebSocket(`${config.wsUrl}?t=${config.testToken}`);

        await new Promise((resolve, reject) => {
            ws.on('open', () => {
                console.log('✅ WebSocket连接成功');
                resolve();
            });

            ws.on('error', (error) => {
                console.error('❌ WebSocket连接失败:', error.message);
                reject(error);
            });

            // 设置超时
            setTimeout(() => reject(new Error('连接超时')), 5000);
        });

        // 2. 监听消息
        ws.on('message', (data) => {
            try {
                const message = JSON.parse(data.toString());
                console.log('📨 收到消息:', JSON.stringify(message, null, 2));

                // 处理不同类型的消息
                switch (message.act_id) {
                    case 100: // 区域信息
                        console.log('🗺️ 区域信息:', {
                            areaId: message.area_id,
                            areaName: message.name,
                            playerCount: message.num
                        });
                        break;

                    case 717: // 当前地图玩家列表
                        console.log('👥 当前地图玩家列表:', {
                            playerCount: message.sum,
                            players: message.list?.length || 0
                        });
                        break;

                    case 1437: // 移动位置响应
                        console.log('🚶 移动位置响应:', message);
                        break;
                }
            } catch (error) {
                console.error('❌ 解析消息失败:', error.message);
            }
        });

        // 3. 等待连接稳定
        await new Promise(resolve => setTimeout(resolve, 1000));

        // 4. 测试角色选择 (指令4)
        console.log('🎭 测试角色选择...');
        const selectRoleMessage = {
            c: 4,
            d: {
                characterId: config.testCharacterId
            }
        };
        ws.send(JSON.stringify(selectRoleMessage));

        // 5. 等待角色选择响应
        await new Promise(resolve => setTimeout(resolve, 2000));

        // 6. 测试获取当前地图玩家列表 (指令717)
        console.log('👥 测试获取当前地图玩家列表...');
        const getPlayersMessage = {
            c: 717,
            d: {
                pageNum: 0
            }
        };
        ws.send(JSON.stringify(getPlayersMessage));

        // 7. 等待响应
        await new Promise(resolve => setTimeout(resolve, 2000));

        // 8. 测试移动位置 (指令1437)
        console.log('🚶 测试移动位置...');
        const moveMessage = {
            c: 1437,
            d: {
                siteId: 3 // 移动到洛阳
            }
        };
        ws.send(JSON.stringify(moveMessage));

        // 9. 等待移动响应
        await new Promise(resolve => setTimeout(resolve, 2000));

        // 10. 再次获取玩家列表，验证位置变化
        console.log('🔄 验证位置变化...');
        ws.send(JSON.stringify(getPlayersMessage));

        // 11. 等待最终响应
        await new Promise(resolve => setTimeout(resolve, 2000));

        console.log('✅ 测试完成，关闭连接');
        ws.close();

    } catch (error) {
        console.error('❌ 测试失败:', error.message);
    }
}

// 测试Redis缓存
async function testRedisCache() {
    console.log('\n🔍 测试Redis缓存...');

    try {
        const Redis = require('ioredis');
        const redis = new Redis({
            host: '43.143.253.188',
            port: 6379,
            password: 'jack666',
            db: 0,
        });

        // 测试连接
        await redis.ping();
        console.log('✅ Redis连接成功');

        // 检查玩家位置缓存
        const locationKey = `player_location:${config.testCharacterId}`;
        const location = await redis.get(locationKey);
        console.log('📍 玩家位置缓存:', location ? JSON.parse(location) : '无');

        // 检查区域在线玩家缓存
        const areaKey = `online_players:area:2`; // 新手村
        const areaPlayers = await redis.hgetall(areaKey);
        console.log('👥 新手村在线玩家:', Object.keys(areaPlayers).length);

        // 检查区域玩家列表缓存
        const areaListKey = `area_players:2`;
        const areaList = await redis.zrange(areaListKey, 0, -1);
        console.log('📋 新手村玩家列表:', areaList);

        await redis.quit();
        console.log('🔌 Redis连接已关闭');

    } catch (error) {
        console.error('❌ Redis测试失败:', error.message);
    }
}

// 运行测试
async function runTests() {
    console.log('🧪 玩家位置功能测试套件');
    console.log('='.repeat(50));

    // 注意：WebSocket测试需要应用正在运行
    console.log('⚠️  注意：请确保NestJS应用正在运行 (npm run dev)');
    console.log('⚠️  注意：请确保使用有效的token和用户ID');

    try {
        // 测试Redis缓存
        await testRedisCache();

        // 测试WebSocket功能（可选）
        if (process.argv.includes('--ws')) {
            await testCharacterLocationFeature();
        } else {
            console.log('\n💡 要测试WebSocket功能，请运行: node test-character-location-feature.js --ws');
        }

    } catch (error) {
        console.error('❌ 测试套件执行失败:', error.message);
    }
}

// 如果直接运行此脚本
if (require.main === module) {
    runTests()
        .then(() => {
            console.log('\n🎉 测试套件执行完成！');
            process.exit(0);
        })
        .catch((error) => {
            console.error('\n💥 测试套件执行失败:', error);
            process.exit(1);
        });
}

module.exports = { testCharacterLocationFeature, testRedisCache };
